/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.edu.pucp.dp1.gui.controlador;

import java.util.ArrayList;
//import pe.edu.pucp.dp1.lectura.modelo.ObjCar;
import Shared.MatrizInterseccionSalida;
import Shared.ObjCar;
import pe.edu.pucp.dp1.lectura.controlador.GestorCar;
import pe.edu.pucp.dp1.procesamiento.controlador.GestorInterseccion;

public class GestorGUI {

    private static GestorGUI instance;

    public static GestorGUI getInstance() {
        if (instance == null) {
            instance = new GestorGUI();
        }
        return instance;
    }

    public static GestorCar gestorCar = GestorCar.getInstance();
    public static GestorInterseccion gestorInter = GestorInterseccion.getInstance();
    int LONG_TILES = 50;
    int TILES_SQUARE = 5;//4 para la cuadra, 1 para la pista
    private char[][] mapInter = new char[LONG_TILES][LONG_TILES];
    private int[][] mapInterDur = new int[LONG_TILES][LONG_TILES];//Duracion
    private int[][] miniMapa = new int[240][160];
    //private int[][] mapVehic = new int[LONG_TILES][LONG_TILES];
    private ArrayList<ObjCar> vehiculos;

    //Zona activa a mostrar, debe ser actualizado desde el GUI
    private int zonaActivaX = 0;
    private int zonaActivaY = 0;

    private double velocidadProm = 0;

    public char[][] genMapPistas() {
        char[][] auxMap = new char[LONG_TILES][LONG_TILES];

        for (int i = 0; i < LONG_TILES; i++) {
            for (int j = 0; j < LONG_TILES; j++) {
                if ((i % TILES_SQUARE) == 0) {
                    if ((j % TILES_SQUARE) == 0) {
                        auxMap[i][j] = 'C';
                    } else {
                        auxMap[i][j] = 'J';
                    }
                } else {
                    if ((j % TILES_SQUARE) == 0) {
                        auxMap[i][j] = 'I';
                    } else {
                        auxMap[i][j] = 'N';
                    }
                }
            }
        }
        return auxMap;
    }

    public void ActMapaGUI(MatrizInterseccionSalida matrizInterseccionSalida) {
        for (int i = 0; i < matrizInterseccionSalida.getMatrizInterseccionSalida().length; i++) {
            for (int j = 0; j < matrizInterseccionSalida.getMatrizInterseccionSalida()[i].length; j++) {
                if (matrizInterseccionSalida.getMatrizInterseccionSalida()[i][j] != null) {
                    //System.out.println("Test ActMapGUI: "+matrizInterseccionSalida.getMatrizInterseccionSalida()[i][j].getTiempoRestante());
                    if (matrizInterseccionSalida.getMatrizInterseccionSalida()[i][j].getEstadoVerdeEjeX() == 0) {
                        mapInter[TILES_SQUARE * i][TILES_SQUARE * j] = 'H';
                    } else {
                        mapInter[TILES_SQUARE * i][TILES_SQUARE * j] = 'V';
                    }
                    mapInterDur[TILES_SQUARE * i][TILES_SQUARE * j] = matrizInterseccionSalida.getMatrizInterseccionSalida()[i][j].getTiempoRestante();
                } else {
                    mapInter[TILES_SQUARE * i][TILES_SQUARE * j] = 'C';
                }
            }
        }
        return;
    }

    public void ActMiniMapaGUI() {
        int nZonasLargo = gestorInter.getnZonasLargo();
        int nZonasAlto = gestorInter.getnZonasAlto();
        for (int i = 0; i < nZonasLargo; i++) {
            for (int j = 0; j < nZonasAlto; j++) {
                if ((i % 4 == 0) && (j % 4 == 0)) {

//                    matrizVehicZona[i][j]=gestorCar.listCarrosPorZona(i, j).getListCars().size();
                    int aux = gestorCar.listCarrosPorZona(i * 1000, j * 1000).getListCars().size();
                    if (aux > 200) {
                        miniMapa[i][j] = 11;
                    } else if (aux > 180) {
                        miniMapa[i][j] = 10;
                    } else if (aux > 160) {
                        miniMapa[i][j] = 9;
                    } else if (aux > 140) {
                        miniMapa[i][j] = 8;
                    } else if (aux > 120) {
                        miniMapa[i][j] = 7;
                    } else if (aux > 100) {
                        miniMapa[i][j] = 6;
                    } else if (aux > 80) {
                        miniMapa[i][j] = 5;
                    } else if (aux > 60) {
                        miniMapa[i][j] = 4;
                    } else if (aux > 40) {
                        miniMapa[i][j] = 3;
                    } else if (aux > 20) {
                        miniMapa[i][j] = 2;
                    } else if (aux > 0) {
                        miniMapa[i][j] = 1;
                    } else {
                        miniMapa[i][j] = 0;
                    }
                }
            }
        }

    }

    public void ActVehGUI(ArrayList<ObjCar> vehiculos) {
        this.vehiculos = vehiculos;
    }

    public void IniciarPintaZona() {
        HiloPintaZona auxHiloPintaZona = new HiloPintaZona();
        auxHiloPintaZona.start();
    }

    public char[][] getMapInter() {
        return mapInter;
    }

    public int[][] getMapInterDur() {
        return mapInterDur;
    }

    public ArrayList<ObjCar> getVehiculos() {
        return vehiculos;
    }

    public int getZonaActivaX() {
        return zonaActivaX;
    }

    public void setZonaActivaX(int zonaActivaX) {
        this.zonaActivaX = zonaActivaX;
    }

    public int getZonaActivaY() {
        return zonaActivaY;
    }

    public void setZonaActivaY(int zonaActivaY) {
        this.zonaActivaY = zonaActivaY;
    }

    public ArrayList<ObjCar> genDataVehiculos() {
        ArrayList<ObjCar> vehiculos = new ArrayList<ObjCar>();

        for (int i = 0; i < 1000; i++) {
            ObjCar auxVeh = new ObjCar();
            int posX;
            int posY;
            int senRandom = (int) (Math.random() * 2);
            int posRandom = (int) (Math.random() * 2);

            if (posRandom == 0) {//Vehiculo en direccion X
                posX = (int) (Math.random() * 1000);
                posY = ((int) (Math.random() * 10)) * 100;
                if (senRandom == 0) {
                    auxVeh.setSentido('E');
                } else {
                    auxVeh.setSentido('O');
                }
            } else {//Vehiculo en direccion Y
                posX = ((int) (Math.random() * 10)) * 100;
                posY = (int) (Math.random() * 1000);
                if (senRandom == 0) {
                    auxVeh.setSentido('N');
                } else {
                    auxVeh.setSentido('S');
                }
            }
            auxVeh.setPosX(posX);
            auxVeh.setPosY(posY);

            vehiculos.add(auxVeh);
        }
        return vehiculos;
    }

    public double getVelocidadProm() {
        return velocidadProm;
    }

    public void setVelocidadProm(double velocidadProm) {
        this.velocidadProm = velocidadProm;
    }

    public int[][] getMiniMapa() {
        return miniMapa;
    }
}
